第13章 客户端检测

想要知道自己代码运行在什么浏览器上,大部分开发者会分析 window.navigator.userAgent 返回的字符串值。所有浏览器都会提供这个值,如果相信这些返回值并基于给定的一组浏览器检测这个字符串,最终会得到关于浏览器和操作系统的比较精确的结果。

通过解析浏览器返回的用户代理字符串,可以推断出下列相关的环境信息:

navigator.geolocation 可以让浏览器脚本感知当前设备的地理位置。

要获取浏览器当前的位置,可以使用 getCurrentPosition() 方法。这个方法返回一个 Coordinates 对象:

navigator.geolocation.getCurrentPosition((position) => {
  p = position;   
  console.log(p.timestamp); // 1673597776813
  console.log(p.coords);     // Coordinates {...}
});

获取浏览器地理位置并不能保证成功。因此 getCurrentPosition() 方法也接收失败回调函数作为第二个参数,这个函数会收到一个 PositionError 对象。在失败的情况下,PositionError 对象中会包含一个 code 属性和一个 message 属性,后者包含对错误的简短描述。code 属性是一个整数, 表示以下 3 种错误:

navigator.geolocation.getCurrentPosition(
  () => {},
  (e) => {
    console.log(e.code);     // 1
    console.log(e.message);  // User denied Geolocation
  }
);

位置请求可以使用 PositionOptions 对象来配置,作为第三个参数提供。这个对象支持以下 3 个属性:

在设备连接到网络时, window 对象上触发 online 事件。响应地,当设备断开网络连接后,window 对象上触发 offline 事件。可以通过 navigator.onLine 属性来确定浏览器的联网状态。这个属性返回一个布尔值,表示浏览器是否联网。

const connectionStateChange = () => console.log(navigator.onLine);
window.addEventListener('online', connectionStateChange); window.addEventListener('offline', connectionStateChange);

浏览器可以访问设备电池及充电状态的信息。navigator.getBattery() 方法会返回一个期约实例,解决为一个 BatteryManager 对象。

navigator.getBattery().then((b) => console.log(b));
// BatteryManager { ... }

BatteryManager 包含 4 个只读属性,提供了设备电池的相关信息:

API 还提供了 4 个电池相关的回调函数,可以通过添加监听器使用属性: